﻿using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using StarsAdmin.Core.DB.Entities;

namespace StarsAdmin.Core.DB.Configs
{
    public class MenuConfig : IEntityTypeConfiguration<MenuEntity>
    {
        public void Configure(EntityTypeBuilder<MenuEntity> builder)
        {
            builder.ToTable("T_Menus");
            builder.Property(p => p.Name).IsRequired().HasMaxLength(64);
            builder.Property(p => p.Title).IsRequired().HasMaxLength(64);
            builder.Property(p => p.Path).IsRequired(false).HasMaxLength(256);
            builder.Property(p => p.Redirect).IsRequired(false).HasMaxLength(256);
            builder.Property(p => p.ComponentPath).IsRequired(false).HasMaxLength(256);
            builder.Property(p => p.Type).IsRequired();
            // 为 Type 字段添加非聚集索引
            builder.HasIndex(e => e.Type).HasDatabaseName("IX_Menus_Type").IsClustered(false);
            //builder.HasIndex(e => e.IsEnabled).HasDatabaseName("IX_Menus_IsEnabled").IsClustered(false);
            builder.Property(p => p.Icon).IsRequired(false).HasMaxLength(64).IsUnicode(false);
            builder.Property(p => p.Description).IsRequired(false).HasMaxLength(256);
            builder.Property(p => p.Permission).IsRequired(false).HasMaxLength(64);
            // 菜单接口多对多配置
            builder.HasMany(r => r.Apis).WithMany(p => p.Menus).UsingEntity<MenuApiEntity>(m =>
            {
                m.ToTable("T_MenusApis");
                // 为 MenuId 和 ApiId 字段添加复合索引
                m.HasIndex(ur => new { ur.MenuId, ur.ApiId }).HasDatabaseName("IX_MenuApis_MenuId_ApiId");
            });

            // 批量导入添加时简化操作使用，故忽略
            builder.Ignore(p => p.RoleIds);
            builder.Ignore(p => p.ApiIds);
        }

        //public void Configure(EntityTypeBuilder<MenuEntity> builder)
        //{
        //    // 基础表结构
        //    builder.ToTable("T_Menus", t => t.HasComment("系统菜单及权限节点表"));

        //    // 核心字段配置
        //    builder.Property(p => p.Name)
        //        .IsRequired()
        //        .HasMaxLength(64)
        //        .HasComment("菜单名称（英文标识）");

        //    builder.Property(p => p.Title)
        //        .IsRequired()
        //        .HasMaxLength(64)
        //        .HasComment("显示标题");

        //    // 路径唯一性约束
        //    builder.HasIndex(m => m.Path)
        //        .IsUnique()
        //        .HasFilter("[Path] IS NOT NULL")
        //        .HasDatabaseName("UX_Menu_Path");

        //    // 权限标识优化
        //    builder.Property(p => p.Permission)
        //        .HasMaxLength(128)
        //        .IsUnicode(false)
        //        .HasComment("权限标识格式: 系统:模块:操作");

        //    // 多对多配置优化
        //    builder.HasMany(m => m.Apis)
        //        .WithMany(a => a.Menus)
        //        .UsingEntity<MenuApiEntity>(m =>
        //        {
        //            m.ToTable("T_MenusApis", t => t.HasComment("菜单接口关联表"));

        //            // 双向查询索引
        //            m.HasIndex(ma => ma.MenuId)
        //                .HasDatabaseName("IX_MenuApis_MenuId")
        //                .IncludeProperties(ma => ma.ApiId);

        //            m.HasIndex(ma => ma.ApiId)
        //                .HasDatabaseName("IX_MenuApis_ApiId")
        //                .IncludeProperties(ma => ma.MenuId);
        //        });

        //    // 软删除及过滤
        //    builder.Property(m => m.IsDeleted)
        //        .HasDefaultValue(false)
        //        .HasComment("软删除标记(0=正常 1=已删除)");

        //    builder.HasQueryFilter(m => !m.IsDeleted);
        //}
    }
}